#include <stdio.h>
#include "../include/server.h"
#include <time.h>
/*
  函数名： loginCheck
  函数功能：判断用户账户信息表中该用户信息是否正确
  函数参数:
          buf : 从客户端收到的用户登录信息
		  pdb:打开的数据库句柄
		  tbName:用户信息数据表的名称
		  currentUser:用来保存客户端输入的当前用户的名称
  返回值：
         0：验证成功
		 -1：验证失败
*/
int loginCheck( char *buf , sqlite3 *pdb , char *tbName , char *currentUser )
{
	char *username;
	char *password;
	char sql[100] = { 0 };
	int iResult;
	char **tbResult;
	char *errMsg;
	int nrow;
	int ncolumn;
	username = strsep( &buf , "##" );
	if( NULL != currentUser )
	{
	    strcpy( currentUser , username );
	}
	password = strsep( &buf , "##" );
	
	sprintf( sql , " select * from %s where account = %s and password = %s; " ,  tbName , username , password );
	iResult = sqlite3_get_table( pdb , sql , &tbResult , &nrow , &ncolumn , &errMsg );
	if( SQLITE_OK != iResult )
	{
		printf( "%s\n" , errMsg );
		return -1;
	}
	if( nrow == 0 )
    {
		printf( "userinfo error\n" );
		return -1;
	}
	printf("用户%s\n上线" , tbResult[ nrow * ncolumn + 0 ] );
	return 0;
}
/*
   函数名：userRegistration
   函数功能：完成新用户的注册
   参数列表：
          buf:从客户端发送过来的账号密码信息
		  pdb:数据库索引
		  tbName:数据表名
   返回值：
        0：注册成功
		-1：注册失败
*/
int userRegistration( char *buf , sqlite3 *pdb , char *tbName )
{
	char tempbuf[300] = { 0 };
	strcpy( tempbuf , buf );
	int flag = loginCheck( tempbuf , pdb , tbName , NULL );
	if( !flag )
	{
		printf( "用户已经存在" );
		return -1;
	}
	char *username;
	char *password;
	char sql[100] = { 0 };
	int iResult;
	char *errMsg;
	username = strsep( &buf , "#" );
	password = strsep( &buf , "#" );
	printf("username = %s\n password = %s\n" , username , password );
	sprintf( sql , "insert into %s( account , password , days ) values( %s , %s , 0 );" , tbName,username , password  );
	iResult = sqlite3_exec( pdb , sql , NULL , NULL , &errMsg );
	if( SQLITE_OK != iResult )
	{
		printf("%s\n" , errMsg );
		return -1;
	}
	return 0;
}
/*
    函数名: updateUserNickname
	函数功能: 用于给用户设置自己的昵称
	函数参数: 
	         pdb: 指向数据库的索引
			 tbName: 用户信息表名字
			 char *tempbuf:用户名
	函数返回值: 
	        0: 修改成功
			1: 修改失败
*/
int updateUserNickname( sqlite3 *pdb , char *tbName , char *tempbuf )
{
	int iResult;
	char *username;
	username = strsep( &tempbuf , "#" );
	char *nickname;
	nickname = strsep( &tempbuf , "#" );
	char sql[200] = { 0 };
	char *errMsg;
	printf( "nickname = %s\n" , nickname );
	printf( "curretUser = %s\n" , username );
	sprintf( sql , "update %s set nickname = '%s' where account = %s ;" , tbName , nickname , username );
	iResult = sqlite3_exec( pdb , sql , NULL , NULL , &errMsg );
	if( SQLITE_OK != iResult )
	{
		printf( "%s\n" , errMsg );
		return -1;
	}
	return 0;
}
/*
    函数名: updateUserPasswd
	函数功能: 用于给用户设置自己的昵称
	函数参数: 
	         pdb: 指向数据库的索引
			 tbName: 用户信息表名字
			 char *buf:用户名
	函数返回值: 
	        0: 修改成功
*/
int updateUserPasswd( sqlite3 *pdb , char *tbName , char *tempbuf )
{
	int iResult;
	char *username;
	username = strsep( &tempbuf , "#" );
	char *password;
	password = strsep( &tempbuf , "#" );
	char sql[200] = { 0 };
	char *errMsg;
	printf( "password = %s\n" , password );
	printf( "curretUser = %s\n" , password );
	sprintf( sql , "update %s set password = '%s' where account = %s ;" , tbName , password , username );
	iResult = sqlite3_exec( pdb , sql , NULL , NULL , &errMsg );
	if( SQLITE_OK != iResult )
	{
		printf( "%s\n" , errMsg );
		return -1;
	}
	return 0;
}
/*
   函数名: addNewPost
   函数功能:将客户端提交过来的账目信息存入数据表中，并将表中的信息反馈给客户端，显示即可
   函数参数:
            username:当前的用户名，我们打算建一个和用户名项目的数据库
			num:该用户当前记账的天数
			buf:从客户端传过来的当天的账目数据
	函数返回值:
	        0:成功
			-1:失败
*/
int addNewPost( char *buf )
{
	char sql[200] = { 0 };
	char tempbuf[BUF_SIZE] = { 0 };
	strcpy( tempbuf , buf );
	char *ptempbuf = tempbuf;
	sqlite3 *temppdb = NULL;
	int iResult;
	char **tbResult;
	char *errMsg;
	int nrow;
	int ncolumn;
	int i , j;
	struct tm *ptr;
	time_t lt;
	char times[20];
	memset( times , 0 , 20 );
	lt = time(NULL);
	ptr = localtime( &lt );
	strftime( times , 20 , "%Y%m%d" , ptr );
	printf( "当前日期为:%s\n" , times );
	char *username;
	char *values;
	username = strsep( &ptempbuf , "#" ); 
	
	iResult = sqlite3_open( username , &temppdb );
	if( SQLITE_OK != iResult )
	{
		printf("数据库创建失败\n");
		return -1;
	}
	//新建一张表，表名为用户名+"YYmmdd"的字符串格式
	sprintf( sql , "create table if not exists tb%s( item char primary key , cost Integer not null , type char not null );" , times  );
	iResult = sqlite3_exec( temppdb , sql , NULL , NULL , &errMsg );
	if( SQLITE_OK != iResult )
	{
		printf("%s\n" , errMsg );
		return -1;
	}
 
	
	while( NULL != (values = strsep( &ptempbuf , "#") )  )
	{
		
		printf( "%s\n" , values );
		memset( sql , 0 , 200 );
		sprintf( sql , "insert into tb%s( item , cost , type ) values( %s );" , times , values );
		printf( "%s\n" , sql );
		iResult = sqlite3_exec( temppdb , sql , NULL , NULL , &errMsg );
		if( SQLITE_OK != iResult )
		{
			printf("%s\n", errMsg);//如果记录有重复，则只需要打印出错误信息，不需要返回，只要建立表格成功即可认为当天的记录创建好了
			continue;
		}
	}
	return 0;
}
/*
   函数名： userinfoSearch
   函数功能：查找用户信息表中用户的账目信息
   函数参数:
        buf:客户端账号名称信息
		pdb:用户信息数据库指针
		tbName:用户信息数据表名称
		num:该用户当前记录了多少天的账
    返回值：
	    0：成功
		-1：失败
*/
int userinfoSearch( char *buf )
{
	char *username = NULL;
	char *tbName = NULL;
	char tempbuf[BUF_SIZE] = { 0 };
	char *ptempbuf = tempbuf;
	strcpy( tempbuf , buf  );
	username = strsep( &ptempbuf , "#" );
	tbName = strsep( &ptempbuf , "#" );
	char sql[100] = { 0 };
	int iResult;
	char **tbResult;
	char *errMsg;
	int nrow;
	int ncolumn;
	int i , j;
	sqlite3 *temppdb = NULL;
	iResult = sqlite3_open( username , &temppdb );
	if( SQLITE_OK != iResult )
	{
		printf("数据库创建失败\n");
		return -1;
	}
	printf("username = %s 用户初始化\n" , username );
	sprintf( sql , " select * from tb%s ; " , tbName );
	memset( buf - 1 , 0 , BUF_SIZE );
	iResult = sqlite3_get_table( temppdb , sql , &tbResult , &nrow , &ncolumn , &errMsg );
	if( SQLITE_OK != iResult || nrow == 0 )
	{
		printf( "%s\n" , errMsg );
	    strcat( buf - 1 , "21001" );
		return -1;
	}
	/*
	int *num;
    *num = atoi( tbResult[ 1 * ncolumn + ncolumn - 1 ] );
	*/
 	for( i = 0 ; i <= nrow ; i++ )
	{
		for( j = 0 ; j < ncolumn ; j++ )
		{
			printf("%s" , tbResult[ ncolumn * i + j ] );
		}
	}
	/*
	printf("打印出当前登录用户的信息\n");
	if( *num == 0 )
	{
		strcat( buf - 1 , "21000" );
	}
	else
	{
		strcat( buf - 1 , "21002" );
	}*/
	strcat( buf - 1 , "21000" );
	strcat( buf - 1 , tbName );
	strcat( buf - 1 , "\n" );
	for( i = 0 ; i <= nrow ; i++ )
	{
		for( j = 0 ; j < ncolumn ; j++ )
		{
			if( tbResult[ ncolumn * i + j ] != NULL )
			{
			    strcat( buf - 1 , tbResult[ ncolumn * i + j ] );
				strcat( buf - 1 , "\t" );
			}
			else
			{
				strcat( buf - 1 , "未设置\t" );
			}
	    }
		strcat( buf - 1 , "\n" );
	}
	return 0;
}
void printHello()
{
     printf( "Hello world\n");
	 return;
}